 1.分布式锁
   
   1).什么是锁
   在单机程序中，当存在多个线程可以同时改变某个变量（可变共享变量量）时，为了保证线程安全
(数据不不能出现脏数据)就需要对变量或代码块做同步，使其在修改这种变量量时能够串行执行消除并
发修改变量。
   对变量量或者堆代码码块做同步本质上就是加锁。目的就是实现多个线程在一个时刻同一个代码块只
能有一个线程可执行
   2).分布式锁
   分布式的环境中会不不会出现脏数据的情况呢？类似单机程序中线程安全的问题。观察下面的例子
   截图电商平台用户下单流程
   上面的设计是存在线程安全问题
   问题
   假设Redis 里面的某个商品库存为1;此时两个用户同时下单，其中一个下单请求执行到第3步，更新
数据库的库存为0，但是第 4 步还没有执行。
   而另外一个用户下单执行到了第 2 步，发现库存还是1，就继续执行第 3 步。但是商品库存已经为0，
所以如果数据库没有限制就会出现超卖的问题。
   解决方法
   用锁把 2、3、4 步锁住，让他们执行完之后，另一个线程才能进来执行。
   公司业务发展迅速，系统应对并发不断提高，解决方案是要增加一台机器，结果会出现更大的问题
   假设有两个下单请求同时到来，分别由两个机器执行，那么这两个请求是可以同时执行了，依然存在超
卖的问题。
   因为如图所示系统是运行在两个不同的 JVM 里面，不同的机器器上，增加的锁只对自己当前 JVM 里面的
线程有效，对于其他 JVM 的线程是无效的。所以现在已经不是线程安全问题。需要保证两台机器加的锁
是同一个锁，此时分布式锁就能解决该问题。
   分布式锁的作用：在整个系统提供一个全局、唯一的锁，在分布式系统中每个系统在进行相关操作的时
候需要获取到该锁，才能执行相应操作。